package com.example.express.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.express.domain.ResponseResult;
import com.example.express.domain.bean.SysUser;
import com.example.express.domain.enums.SexEnum;
import com.example.express.domain.enums.ThirdLoginTypeEnum;
import com.example.express.domain.vo.BootstrapTableVO;
import com.example.express.domain.vo.admin.AdminUserInfoVO;
import com.example.express.domain.vo.user.UserInfoVO;

import javax.servlet.http.HttpSession;
import java.util.Map;

/**
 * 系统用户服务业务
 * @author 周欣
 */
public interface SysUserService extends IService<SysUser> {

    /**
     * 据用户名查找用户
     * @param username
     * @return
     */
    SysUser getByName(String username);

    /**
     * 根据手机号查找用户
     * @param tel
     * @return
     */
    SysUser getByTel(String tel);

    /**
     * 根据三方登陆查找用户
     * @param thirdLoginId
     * @param thirdLoginTypeEnum
     * @return
     */
    SysUser getByThirdLogin(String thirdLoginId, ThirdLoginTypeEnum thirdLoginTypeEnum);

    /**
     * 获取用户信息
     * @param userId
     * @return
     */
    UserInfoVO getUserInfo(String userId);

    /**
     * 根据用户名判断用户是否存在
     * @param username
     * @return
     */
    boolean checkExistByUsername(String username);

    /**
     * 根据手机号判断用户是否存在
     * @param mobile
     * @return
     */
    boolean checkExistByTel(String mobile);

    /**
     * 根据身份证号判断用户是否存在
     * @param idCard
     * @return
     */
    boolean checkExistByIdCard(String idCard);

    /**
     * 是否实名认证
     * @param user
     * @return
     */
    boolean checkApplyRealName(SysUser user);

    /**
     * 能否切换角色
     * @param user
     * @return
     */
    boolean canChangeRole(SysUser user);

    /**
     * 校验密码
     * @param userId
     * @param password
     * @return
     */
    boolean checkPassword(String userId, String password);

    /**
     * 三方登陆逻辑
     * @param thirdLoginId
     * @param thirdLoginTypeEnum
     * @return
     */
    ResponseResult thirdLogin(String thirdLoginId, ThirdLoginTypeEnum thirdLoginTypeEnum);

    /**
     * 根据用户名注册
     * @param username
     * @param password
     * @return
     */
    ResponseResult registryByUsername(String username, String password);

    /**
     * 根据手机号注册
     * @param tel
     * @param code
     * @param session
     * @return
     */
    ResponseResult registryByTel(String tel, String code, HttpSession session);

    /**
     * 人脸注册
     * @param faceToken
     * @param gender male:男性 female:女性
     * @return
     */
    ResponseResult registryByFace(String faceToken, String gender);

    /**
     * 修改密码
     * @param userId
     * @param oldPassword
     * @param newPassword
     * @return
     */
    ResponseResult resetPassword(String userId, String oldPassword, String newPassword);

    /**
     * 设置用户名密码
     * @param user
     * @param username
     * @param password
     * @return
     */
    ResponseResult setUsernameAndPassword(SysUser user, String username, String password);

    /**
     * 设置实名信息
     * @param user
     * @param realName
     * @param idCard
     * @return
     */
    ResponseResult setRealName(SysUser user, String realName, String idCard);

    /**
     * 设置/修改手机号码
     * @param user
     * @param tel
     * @param code
     * @param session
     * @return
     */
    ResponseResult setTel(SysUser user, String tel, String code, HttpSession session);

    /**
     * 设置/修改性别
     * @param sysUser
     * @param sexEnum
     * @return
     */
    ResponseResult setSex(SysUser sysUser, SexEnum sexEnum);

    /**
     * 设置/修改高校信息
     * @param user
     * @param schoolId 学校ID
     * @param studentIdCard 学号
     * @return
     */
    ResponseResult setSchoolInfo(SysUser user, Integer schoolId, String studentIdCard);

    /**
     * 切换角色
     * user -> courier
     * @param userId
     * @return
     */
    ResponseResult changeRole(String userId);

    /**
     * 通过用户id 获取 frontName
     * @param userId
     * @return
     */
    String getFrontName(String userId);

    /**
     * 通过用户 获取 frontName
     * @param user
     * @return
     */
    String getFrontName(SysUser user);

    /**
     * 获取 AdminUserInfoVO 列表
     * @param sysUserPage
     * @param wrapper
     * @return
     */
    BootstrapTableVO<AdminUserInfoVO> pageAdminUserInfoVO(Page<SysUser> sysUserPage, QueryWrapper<SysUser> wrapper);

    /**
     * 绑定或更新人脸数据
     * @param faceToken
     * @param userId
     * @return
     */
    ResponseResult bindOrUpdateFace(String faceToken, String userId);

    /**
     * 管理员仪表盘展示数据
     * @return
     */
    Map<String, Integer> getAdminDashboardData();
}
